package mx.edu.itschapala.ssrp.bean;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.ApplicationScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
import mx.edu.itschapala.ssrp.ln.CatalogoLN;
import mx.edu.itschapala.ssrp.modelo.AsignacionAsesor;
import mx.edu.itschapala.ssrp.modelo.Cronograma;
import mx.edu.itschapala.ssrp.modelo.Proyecto;
import mx.edu.itschapala.ssrp.modelo.Usuario;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.DefaultScheduleEvent;
import org.primefaces.model.DefaultScheduleModel;
import org.primefaces.model.ScheduleEvent;
import org.primefaces.model.ScheduleModel;

@Named("cronogramaBean")
@ApplicationScoped
public class CronogramaBean {

    @EJB
    private CatalogoLN catalogoLN;

    public CronogramaBean() {

    }

    private List<Cronograma> cronogramas;

    private Cronograma cronograma;
    private String accion;
    private Proyecto proyecto;
    private Date dateFI, dateDE, dateDRI, dateDRE;
    private ScheduleModel eventModel;
    private ScheduleEvent event = new DefaultScheduleEvent();
    
    private String actv = "";

    public Usuario getUsuarioLog() {
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        return (Usuario) externalContext.getSessionMap().get("USUARIO_LOGUEADO");
    }

    public void prepararNuevo(ActionEvent evt) {

        
        accion = "nuevo";
        cronograma = new Cronograma();
        
        cronograma.setProyecto(proyecto);
        dateFI=new Date();
        dateDE=new Date();
    }

    public void prepararEditar(ActionEvent evt) {
        accion = "editar";
        String idtemp = evt.getComponent().getClientId();
        int id = Integer.parseInt(idtemp.split(":")[2]);
        cronograma = cronogramas.get(id);

    }

    public void prepararRemover(ActionEvent evt) {
        accion = "remover";
        String idtemp = evt.getComponent().getClientId();
        int id = Integer.parseInt(idtemp.split(":")[2]);
        cronograma = cronogramas.get(id);

    }

    public void procesarAccion(ActionEvent e) {

        Usuario u = getUsuarioLog();
        switch (accion) {
            case "nuevo":
                /*cronograma.setProyecto(catalogoLN.getProyectoPorID(proyectoId));*/
                cronograma.setFechaInicial(dateFI.getTime());
                
                cronograma.setDiasEstimados(dateDE.getTime());
                
                catalogoLN.crearCronograma(cronograma);
                break;
            case "editar":
                //cronograma.setProyecto(catalogoLN.getProyectoPorID(proyectoId));
                if (u.getPerfil().equals("asesor")) {
                    cronograma.setDiasReales(dateDRI.getTime());
                } else {
                    catalogoLN.editarCronograma(cronograma);
                }
                break;
            case "remover":
                catalogoLN.removerCronograma(cronograma);
                break;
                
            case "real":
                catalogoLN.editarCronograma(cronograma);
                break;
        }
        
    }

    public void prepararCronograma(ActionEvent evt) {
        String idtemp = evt.getComponent().getClientId();
        int id = Integer.parseInt(idtemp.split(":")[2]);

        Usuario u = getUsuarioLog();

        List<AsignacionAsesor> listaAsesor = catalogoLN.getProyectosAsesorPorID(u.getNcontrol());
        List<Proyecto> proyectos = new ArrayList<>();
        for (AsignacionAsesor aa : listaAsesor) {
            proyectos.add(aa.getProyecto());
        }

        proyecto = proyectos.get(id);

        //proyectoId=proyectos.get(id).getId();                       
    }

    public List<Cronograma> getCronogramas() {

        Usuario u = getUsuarioLog();
        switch (u.getPerfil()) {
            case "alumno":
                proyecto = catalogoLN.getProyectoPorAlumno(u.getNcontrol());
                cronogramas = catalogoLN.getCronogramasPorProyecto(proyecto);
                break;
            case "docente":
                cronogramas = catalogoLN.getCronogramasPorProyecto(proyecto);
                //cronogramas=catalogoLN.getCronogramasPorProyecto(catalogoLN.getProyectosAsesorPorID(Integer.parseInt(u.getNcontrol())).getProyecto());
                break;
        }

        cronogramas = catalogoLN.getCronogramas();
        return cronogramas;
    }

    public Cronograma getCronograma() {
        return cronograma;
    }

    public void setCronograma(Cronograma cronograma) {
        dateFI=new Date(cronograma.getFechaInicial());
        dateDE=new Date(cronograma.getDiasEstimados());
        this.cronograma = cronograma;
    }

    public String getAccion() {
        return accion;
    }
    public void setAccion(String accion){
        this.accion=accion;
    }

    public Date getDateFI() {
        return dateFI;
    }

    public void setDateFI(Date dateFI) {
        this.dateFI = dateFI;
    }

    public Date getDateDE() {
        return dateDE;
    }

    public void setDateDE(Date dateDE) {
        this.dateDE = dateDE;
    }

    public Date getDateDRI() {
        return dateDRI;
    }

    public void setDateDRI(Date dateDRI) {
        this.dateDRI = dateDRI;
    }

    public void procesarFecha() {
        cronograma.setDiasEstimados(dateDE.getTime());
        cronograma.setFechaInicial(dateFI.getTime());
        // cronograma.setDiasReales(dateDR.getTime());
    }

    public ScheduleModel getEventModel() {
        eventModel = new DefaultScheduleModel();
        //eventModel.addEvent(new DefaultScheduleEvent("", new Date(), new Date()));
        for (Cronograma c : getCronogramas()) {
            DefaultScheduleEvent scheEvent = new DefaultScheduleEvent(c.getActividad()+" (ESTIMADO)", new Date(c.getFechaInicial()), new Date(c.getDiasEstimados()));
            scheEvent.setStyleClass("estimadoclass");
            eventModel.addEvent(scheEvent);
            if(c.getDiasReales()!=0&&c.getDiasRealesFinal()!=0){
                DefaultScheduleEvent scheEventR = new DefaultScheduleEvent(c.getActividad()+" (REAL)", new Date(c.getFechaInicial()), new Date(c.getDiasEstimados()));
                scheEventR.setStyleClass("realclass");
                eventModel.addEvent(scheEventR);
            }
            
        }
        return eventModel;
    }

    public void preDiasReales(Cronograma c) {
        accion="real";
        cronograma = c;
        dateDRI=new Date();
        dateDRE=new Date();
        
    }

    public void setProyecto(Proyecto proyecto) {
        this.proyecto = proyecto;
    }

    public Date getFechaMin() {
        Calendar fecha = new GregorianCalendar();
        int año = fecha.get(Calendar.YEAR);
        //String fechaR;
        Date fechaR;
        if (proyecto.getPeriodo().equals("FEB-JUL")) {
            //fechaR="01/02/"+año;
            fechaR=new Date();
            fechaR.setMonth(1);
            fechaR.setDate(1);
            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>><"+fechaR.toString());
        }else{
            //fechaR="01/08/"+año;
            fechaR=new Date();
            fechaR.setMonth(8);
            fechaR.setDate(1);
            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><"+fechaR.toString());
        }
        return fechaR;
    }
    public String getFechaMax() {
        Calendar fecha = new GregorianCalendar();
        int año = fecha.get(Calendar.YEAR);
        String fechaR;

        if (proyecto.getPeriodo().equals("FEB-JUL")) {
            fechaR="31/07/"+año;
        }else{
            fechaR="31/01/"+año+1;
        }
        return fechaR;
    }

    //-------------------------------------no usado--------------------------------------------
    public String getTipo() {
        return getUsuarioLog().getPerfil();
    }

    private void addMessage(FacesMessage message) {
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public String getFechasCronogramas() {
        Usuario u = getUsuarioLog();
        String fechas = "[";
        switch (u.getPerfil()) {
            case "alumno":
                //cronogramas = catalogoLN.getCronogramasPorProyecto(catalogoLN.getProyectoPorAlumno(u.getNcontrol()));
                for (Cronograma c : catalogoLN.getCronogramasPorProyecto(catalogoLN.getProyectoPorAlumno(u.getNcontrol()))) {
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

                    Date dateF = new Date(c.getDiasEstimados());

                    Date dateI = new Date(c.getFechaInicial());
                    fechas += "{title : '" + c.getActividad() + "', start : '" + sdf.format(dateI) + "', end : '" + sdf.format(dateF) + "'},";
                }

                break;

        }
        fechas = fechas.substring(0, fechas.length() - 1);
        fechas += "]";
        return fechas;
    }

    public String getActv() {
        return actv;
    }

    public ScheduleEvent getEvent() {
        return event;
    }

    public void setEvent(ScheduleEvent event) {
        this.event = event;
    }

    public void onEventSelect(SelectEvent selectEvent) {
        Date eventd = (Date) selectEvent.getObject();
        //ScheduleEvent eventd=(ScheduleEvent)selectEvent.getObject();
        if (eventd == null) {
            System.out.println("estoy vacio aqui");
        }
        if ((selectEvent.getObject()) == null) {
            System.out.println("etoy ads aasasaaas");
        } else {
            System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" + selectEvent.toString());
        }

        //int index = eventModel.getEvents().indexOf(event);
        String index = event.getId();
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><" + eventModel.getEventCount());

        System.out.println(">>>>>>>>>>>>>>>>><" + index);
        //System.out.println(">>>>>>>>>>>>>>>>>>>>>>id:"+event.getTitle());
        //cronograma = cronogramas.get(Integer.parseInt(event.getId()));
        //System.out.println(">>>>>>>>"+event.getDescription()+"  "+cronograma.getActividad());
    }

    public void addEvent(ActionEvent ect) {

        if (actv.equals("real")) {

            cronograma.setDiasReales(event.getEndDate().getTime());
            catalogoLN.editarCronograma(cronograma);

            event = new DefaultScheduleEvent();

            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Actividad actualizada", "A la actividad se agregaron los días reales");
            addMessage(message);
        } else {

            eventModel.addEvent(event);
            cronograma.setActividad(event.getTitle());
            cronograma.setDiasEstimados(event.getEndDate().getTime());
            cronograma.setFechaInicial(event.getStartDate().getTime());
            cronograma.setProyecto(catalogoLN.getProyectoPorAlumno(getUsuarioLog().getNcontrol()));
            catalogoLN.crearCronograma(cronograma);

            event = new DefaultScheduleEvent();

            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Actividad agregada", "La actividad se agrego correctamente");
            addMessage(message);
        }
    }

    public void onDateSelect(SelectEvent selectEvent) {
        cronograma = new Cronograma();
        event=new DefaultScheduleEvent();
        
        //event = new DefaultScheduleEvent("", (Date) selectEvent.getObject(), (Date) selectEvent.getObject());

    }

    /*
     public BubbleChartModel getGrafica() {

     if (getTipo().equals("alumno")) {

     proyecto = catalogoLN.getProyectoPorAlumno(getUsuarioLog().getNcontrol());
     }
     BubbleChartModel model = new BubbleChartModel();
     model.setTitle("Cronograma");
     model.getAxis(AxisType.X).setLabel("Semana");
     Axis yAxis = model.getAxis(AxisType.Y);
     yAxis.setMin(0);
     yAxis.setMax((catalogoLN.getCronogramasPorProyecto(proyecto).size() + 1) * 10);

     yAxis.setLabel("Actividad");

     int pos = 1;
     int rad;
     int max;
     for (Cronograma c : catalogoLN.getCronogramasPorProyecto(proyecto)) {
     rad = 8;

     if (obtenerSemana(c.getFechaInicial()) >= 31) {

     if (obtenerSemana(c.getFechaInicial()) == obtenerSemana(c.getDiasEstimados())) {
     model.add(new BubbleChartSeries(c.getActividad(), (obtenerSemana(c.getFechaInicial()) - 31), pos * 10, rad));
     } else if (obtenerSemana(c.getFechaInicial()) > obtenerSemana(c.getDiasEstimados())) {
     model.add(new BubbleChartSeries(c.getActividad(), (obtenerSemana(c.getFechaInicial()) - 31), pos * 10, rad));

     } else if (obtenerSemana(c.getFechaInicial()) < obtenerSemana(c.getDiasEstimados())) {
     max = obtenerSemana(c.getDiasEstimados()) - obtenerSemana(c.getFechaInicial());
     for (int x = 1; x <= max; x++) {
     model.add(new BubbleChartSeries(c.getActividad(), ((obtenerSemana(c.getFechaInicial()) + x) - 31), pos * 10, rad));
     if (rad > 5) {
     rad--;
     }
     }
     }

     }

     if (obtenerSemana(c.getFechaInicial()) <= 26 && obtenerSemana(c.getFechaInicial()) > 5) {

     if (obtenerSemana(c.getFechaInicial()) == obtenerSemana(c.getDiasEstimados())) {
     model.add(new BubbleChartSeries(c.getActividad(), (obtenerSemana(c.getFechaInicial()) - 5), pos * 10, rad));
     } else if (obtenerSemana(c.getFechaInicial()) > obtenerSemana(c.getDiasEstimados()) - 5) {
     model.add(new BubbleChartSeries(c.getActividad(), obtenerSemana(c.getFechaInicial()), pos * 10, rad));

     } else if (obtenerSemana(c.getFechaInicial()) < obtenerSemana(c.getDiasEstimados())) {
     max = obtenerSemana(c.getDiasEstimados()) - obtenerSemana(c.getFechaInicial());
     for (int x = 1; x <= max; x++) {
     model.add(new BubbleChartSeries(c.getActividad(), (obtenerSemana(c.getFechaInicial()) + x), pos * 10, rad));
     if (rad > 5) {
     rad--;
     }
     }
     }

     }

     pos++;
     }

     return model;
     }*/
    public int obtenerSemana(Long fecha) {
        Date date = new Date(fecha);
        Calendar calendar = Calendar.getInstance();
        calendar.setFirstDayOfWeek(Calendar.MONDAY);
        calendar.setMinimalDaysInFirstWeek(4);
        calendar.setTime(date);
        return calendar.get(Calendar.WEEK_OF_YEAR);
    }
}
